package com.springcloud.alibaba.sentinel.controller;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.springcloud.alibaba.sentinel.exception.CustmerBlockHandlerGolable;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.TimeUnit;

/**
 * @Author:RenPu
 * @Date: 2020/7/4 12:47
 * @Version: 1.0
 * @description:
 */

@RestController
@Slf4j
public class NacosSentinelController {

    @Value("${server.port}")
    private String SERVER_PORT;


    //QPS在sentinel的默认使用设置测试
    @GetMapping(value = "/sentinel/sentinelServerTestMenthod1")
    public String sentinelServerTestMenthod1(){


//        //设置暂停毫秒数，为了测试sentinel的线程数的限流功能
//        try {
//            TimeUnit.MILLISECONDS.sleep( 800 );
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }

        return "当前的服务端口为:"+ SERVER_PORT+"此方法是方法1************O(∩_∩)O哈哈~";
    }


    //测试sentinel的关联流控，例如1方法属于下订单，2方法属于支付，设置1方法关联2方法，此时2方法有很大得到压力就会限制1方法下单的数量
    @GetMapping(value = "/sentinel/sentinelServerTestMenthod2")
    public String sentinelServerTestMenthod2(){

        log.info( Thread.currentThread().getName()+"/t"+"-----------sentinelServerTestMenthod2" );
        return "当前的服务端口为:"+SERVER_PORT+"此方法是方法2************O(∩_∩)O哈哈~";
    }


    //测试sentinel的降级RT：平均响应时间 (单位为秒，最大值4500)   流控，例如1方法属于下订单，2方法属于支付，设置1方法关联2方法，此时2方法有很大得到压力就会限制1方法下单的数量
    @GetMapping(value = "/sentinel/sentinelServerTestMenthod3")
    public String sentinelServerTestMenthod3(){
        //设置暂停毫秒数，为了测试sentinel的线程数的限流功能
        try {
            TimeUnit.SECONDS.sleep( 1 );
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "当前的服务端口为:"+SERVER_PORT+"此方法是方法3 测试RT降级策略************O(∩_∩)O哈哈~";
    }


    //测试sentinel的异常降级
    @GetMapping(value = "/sentinel/sentinelServerTestMenthod4")
    public String sentinelServerTestMenthod4(){
//        //设置暂停毫秒数，为了测试sentinel的线程数的限流功能
//        try {
//            TimeUnit.SECONDS.sleep( 1 );
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }

        //设置异常的出现，满足条件一秒钟满足5个请求的同时，也要满足有异常
        int i=10/0;
        return "当前的服务端口为:"+SERVER_PORT+"此方法是方法4 测试异常降级策略************O(∩_∩)O哈哈~";
    }



    //测试sentinel的异常数降级
    @GetMapping(value = "/sentinel/sentinelServerTestMenthod5")
    public String sentinelServerTestMenthod5(){
//        //设置暂停毫秒数，为了测试sentinel的线程数的限流功能
//        try {
//            TimeUnit.SECONDS.sleep( 1 );
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }

        //设置异常的出现，满足条件一秒钟满足5个请求的同时，也要满足有异常
        int i=10/0;
        return "当前的服务端口为:"+SERVER_PORT+"此方法是方法5 异常数降级策略************O(∩_∩)O哈哈~";
    }


    //测试sentinel的会根据热点的key进行限流，例如武汉新冠肺炎比较热点，对此请求进行限流  @RequestParam注解 当required = false时,参数不是必须要传送的
    @GetMapping(value = "/getHotKe")
    @SentinelResource(value = "getHotKe",blockHandler = "hostKey",fallback = "hostKey")
    public String sentinelHostKe(
            @RequestParam(value = "p1",required = false) String p1,
            @RequestParam(value = "p2",required = false) String p2){
//        //设置暂停毫秒数，为了测试sentinel的线程数的限流功能
//        try {
//            TimeUnit.SECONDS.sleep( 1 );
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }

        //设置异常的出现，满足条件一秒钟满足5个请求的同时，也要满足有异常
        //int i=10/0;
        return "当前的服务端口为:"+SERVER_PORT+"此方法是方法5 热点key限流策略************O(∩_∩)O哈哈~";
    }



    public String hostKey(String p1, String p2, BlockException be){

        return "******----------deal******getHostkeyo(╥﹏╥)o";

    }






    //测试sentinel的会根据热点的key进行限流，例如武汉新冠肺炎比较热点，对此请求进行限流  @RequestParam注解 当required = false时,参数不是必须要传送的
    @GetMapping(value = "/custmerBlockHandler")
    @SentinelResource(value = "custmerBlockHandler",blockHandlerClass = CustmerBlockHandlerGolable.class,blockHandler = "testMenthod1")
    public String custmerBlockHandler(){
//        //设置暂停毫秒数，为了测试sentinel的线程数的限流功能
//        try {
//            TimeUnit.SECONDS.sleep( 1 );
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }

        //设置异常的出现，满足条件一秒钟满足5个请求的同时，也要满足有异常
        //int i=10/0;
        return "当前的服务端口为:"+SERVER_PORT+"此方法是方法5 热点key限流策略************O(∩_∩)O哈哈~";
    }




}